/**
 * 
 */
package appStarshipPushups.client.form;

import java.awt.Color;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;

import appStarshipPushups.client.model.Connection;
import appStarshipPushups.client.model.ConnectionException;

/**
 * @author Adam Labranche
 *
 */
public class AppMenu extends JMenuBar implements ActionListener
{
	public static final long serialVersionUID = 1L;
	// Commandes d'action des boutons de menu.
	private static final String ACT_JOIN_GAME = "join game";
	private static final String ACT_LEAVE_GAME = "leave game";
	private static final String ACT_ABOUT = "about";
	private static final String ACT_QUIT = "quit";
	
	// Textes des info-bulles des boutons de menu.
	private static final String TT_JOIN_GAME = "Joindre une partie";
	private static final String TT_LEAVE_GAME = "Quitter la partie";
	private static final String TT_ABOUT = "Visionner l'information à propos du jeu";
	private static final String TT_QUIT = "Quitter le jeu";
	
	// Textes des boutons de menu.
	private static final String MNU_GAME = "Partie";
	private static final String MNU_HELP = "Aide";
	private static final String MNI_JOIN_GAME = "Joindre une partie";
	private static final String MNI_LEAVE_GAME = "Quitter la partie";
	private static final String MNI_ABOUT = "À propos...";
	private static final String MNI_QUIT = "Quitter";
	
	private static final Color COLOR_BG = new Color(196, 196, 196);
	/**
	 * Représente le menu principal.
	 */
	private JMenu mnuGame = new JMenu(AppMenu.MNU_GAME);
	/**
	 * Représente le menu d'aide.
	 */
	private JMenu mnuHelp = new JMenu(AppMenu.MNU_HELP);
	/**
	 * Représente le bouton de menu qui permet de joindre une partie.
	 */
	private JMenuItem mniJoinGame = new JMenuItem(AppMenu.MNI_JOIN_GAME);
	/**
	 * Représente le bouton de menu qui permet de quitter la partie.
	 */
	private JMenuItem mniLeaveGame = new JMenuItem(AppMenu.MNI_LEAVE_GAME);
	/**
	 * Représente le bouton de menu qui permet de visionner l'information du 
	 * jeu.
	 */
	private JMenuItem mniAbout = new JMenuItem(AppMenu.MNI_ABOUT);
	/**
	 * Représente le bouton de menu qui permet de quitter le jeu.
	 */
	private JMenuItem mniQuit = new JMenuItem(AppMenu.MNI_QUIT);
	
	/**
	 * C'est le constructeur par défaut.
	 */
	public AppMenu()
	{
		super();
		this.init();
	}

	/**
	 * Cette fonction initialise l'interface du menu.
	 */
	private void init()
	{
		this.setBorderPainted(false);
		
		//this.mnuGame.setBorder(border);
		
		this.setTooltips();
		
		this.setBG();
		
		// On initialise les commandes d'action.
		this.mniJoinGame.setActionCommand(AppMenu.ACT_JOIN_GAME);
		this.mniJoinGame.addActionListener(this);
		this.mniLeaveGame.setActionCommand(AppMenu.ACT_LEAVE_GAME);
		this.mniLeaveGame.addActionListener(this);
		this.mniAbout.setActionCommand(AppMenu.ACT_ABOUT);
		this.mniAbout.addActionListener(this);
		this.mniQuit.setActionCommand(AppMenu.ACT_QUIT);
		this.mniQuit.addActionListener(this);
		
		// On initialise les raccourcis claviers.
		this.setMnemonics();
		this.setAccelerators();
		
		// On monte le contenu des menus.
		this.mnuGame.add(this.mniJoinGame);
		this.mniLeaveGame.setEnabled(false);
		this.mnuGame.add(this.mniLeaveGame);
		this.mnuGame.addSeparator();
		this.mnuGame.add(this.mniQuit);
		this.mnuHelp.add(this.mniAbout);
		this.add(this.mnuGame);
		this.add(this.mnuHelp);
	}
	
	/**
	 * Cette fonction initialise les Mnemonics des objets du menu.
	 */
	private void setMnemonics()
	{
		this.mnuGame.setMnemonic('P');
		this.mnuHelp.setMnemonic('A');
		this.mniJoinGame.setMnemonic('J');
		this.mniLeaveGame.setMnemonic('u');
		this.mniQuit.setMnemonic('Q');
		this.mniAbout.setMnemonic('r');
	}
	
	/**
	 * Cette fonction initialise les touches de raccourcis clavier des objets du
	 * menu.
	 */
	private void setAccelerators()
	{
		this.mniJoinGame.setAccelerator(KeyStroke.getKeyStroke('J', Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false));
		this.mniLeaveGame.setAccelerator(KeyStroke.getKeyStroke('L', Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false));
		this.mniQuit.setAccelerator(KeyStroke.getKeyStroke('Q', Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false));
		this.mniAbout.setAccelerator(KeyStroke.getKeyStroke('A', Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false));
	}
	
	/**
	 * Cette fonction initialise les info-bulles des objets du menu.
	 */
	private void setTooltips()
	{
		this.mniJoinGame.setToolTipText(AppMenu.TT_JOIN_GAME);
		this.mniLeaveGame.setToolTipText(AppMenu.TT_LEAVE_GAME);
		this.mniQuit.setToolTipText(AppMenu.TT_QUIT);
		this.mniAbout.setToolTipText(AppMenu.TT_ABOUT);
	}
	
	/**
	 * Cette fonction initialise les couleurs de fond du menu et de ses objets.
	 */
	private void setBG()
	{
		this.mnuGame.setBackground(AppMenu.COLOR_BG);
		this.mnuHelp.setBackground(AppMenu.COLOR_BG);
		this.mniJoinGame.setBackground(AppMenu.COLOR_BG);
		this.mniLeaveGame.setBackground(AppMenu.COLOR_BG);
		this.mniQuit.setBackground(AppMenu.COLOR_BG);
		this.mniAbout.setBackground(AppMenu.COLOR_BG);
		this.setBackground(AppMenu.COLOR_BG);
	}
	
	/**
	 * Cette fonction avertie le menu que la partie a commencée.
	 */
	public void gameStarted()
	{
		this.mniLeaveGame.setEnabled(true);
		this.mniJoinGame.setEnabled(false);
	}
	
	/**
	 * Cette fonction avertie le menu que la partie est terminée.
	 */
	public void gameEnded()
	{
		this.mniLeaveGame.setEnabled(false);
		this.mniJoinGame.setEnabled(true);
	}
	
    /**
     * Appelée lorsqu'une action se produit.
     */
    public void actionPerformed(ActionEvent e)
    {
    	String actCmd = e.getActionCommand();
    	if(actCmd.equals(AppMenu.ACT_JOIN_GAME))
    	{
    		if(this.mniLeaveGame.isEnabled())
    		{
    			System.out.println("Impossible de se joindre à une partie de plus.");
    		}
    		else
    		{
    			LoginWindow login = new LoginWindow();
    			login.setVisible(true);
    		}
    	}
    	else if(actCmd.equals(AppMenu.ACT_LEAVE_GAME))
    	{
    		try
    		{
    			Connection.getInstance().sendQuit();
     		}
    		catch(ConnectionException ce)
    		{
    			System.err.println(ce.getMessage());
    		}
    	}
    	else if(actCmd.equals(AppMenu.ACT_ABOUT))
    	{
    		AboutDlg abDlg = new AboutDlg();
    		abDlg.setVisible(true);
    	}
    	else if(actCmd.equals(AppMenu.ACT_QUIT))
    	{
    		AppFrame.getInstance().askExitConfirmation();
    	}
    }

}
